@echo off
echo ====================================
echo 小型数据库系统 - Windows编译脚本
echo ====================================

REM 检查编译器是否存在
where g++ >nul 2>nul
if %errorlevel% neq 0 (
    echo [错误] 未找到g++编译器！
    echo 请先安装MinGW-w64或MSYS2
    echo 下载地址：https://www.mingw-w64.org/
    echo 或使用Visual Studio的Developer Command Prompt
    pause
    exit /b 1
)

echo [信息] 检测到g++编译器，开始编译...

REM 设置编译参数
set CXXFLAGS=-std=c++17 -Wall -Wextra -I.

REM 1. 编译SQL编译器模块
echo.
echo ====================================
echo 编译SQL编译器模块...
echo ====================================

cd sql_compiler_cpp
if not exist "obj" mkdir obj

echo 编译Token模块...
g++ %CXXFLAGS% -c Token.cpp -o obj/Token.o
if %errorlevel% neq 0 goto error

echo 编译Lexer模块...
g++ %CXXFLAGS% -c Lexer.cpp -o obj/Lexer.o
if %errorlevel% neq 0 goto error

echo 编译AST模块...
g++ %CXXFLAGS% -c AST.cpp -o obj/AST.o
if %errorlevel% neq 0 goto error

echo 编译Parser模块...
g++ %CXXFLAGS% -c Parser.cpp -o obj/Parser.o
if %errorlevel% neq 0 goto error

echo 编译SymbolTable模块...
g++ %CXXFLAGS% -c SymbolTable.cpp -o obj/SymbolTable.o
if %errorlevel% neq 0 goto error

echo 编译SemanticAnalyzer模块...
g++ %CXXFLAGS% -c SemanticAnalyzer.cpp -o obj/SemanticAnalyzer.o
if %errorlevel% neq 0 goto error

echo 编译测试程序...
g++ %CXXFLAGS% -c test_parser.cpp -o obj/test_parser.o
if %errorlevel% neq 0 goto error

echo 编译交互式编译器...
g++ %CXXFLAGS% -c interactive_compiler.cpp -o obj/interactive_compiler.o
if %errorlevel% neq 0 goto error

echo 链接SQL编译器...
g++ obj/Token.o obj/Lexer.o obj/AST.o obj/Parser.o obj/SymbolTable.o obj/SemanticAnalyzer.o obj/test_parser.o -o test_parser.exe
if %errorlevel% neq 0 goto error

echo 链接交互式编译器...
g++ obj/Token.o obj/Lexer.o obj/AST.o obj/Parser.o obj/SymbolTable.o obj/SemanticAnalyzer.o obj/interactive_compiler.o -o interactive_compiler.exe
if %errorlevel% neq 0 goto error

echo [成功] SQL编译器模块编译完成！

REM 2. 编译存储系统模块
echo.
echo ====================================
echo 编译存储系统模块...
echo ====================================

cd ../storage_system_cpp
if not exist "obj" mkdir obj

echo 编译FileManager模块...
g++ %CXXFLAGS% -c FileManager.cpp -o obj/FileManager.o
if %errorlevel% neq 0 goto error

echo 编译Page模块...
g++ %CXXFLAGS% -c Page.cpp -o obj/Page.o
if %errorlevel% neq 0 goto error

echo 编译BufferManager模块...
g++ %CXXFLAGS% -c BufferManager.cpp -o obj/BufferManager.o
if %errorlevel% neq 0 goto error

echo 编译StorageManager模块...
g++ %CXXFLAGS% -c StorageManager.cpp -o obj/StorageManager.o
if %errorlevel% neq 0 goto error

echo 编译SystemCatalog模块...
g++ %CXXFLAGS% -c SystemCatalog.cpp -o obj/SystemCatalog.o
if %errorlevel% neq 0 goto error

echo 编译测试程序...
g++ %CXXFLAGS% -c test_page_system.cpp -o obj/test_page_system.o
if %errorlevel% neq 0 goto error

echo 编译交互式演示...
g++ %CXXFLAGS% -c interactive_demo.cpp -o obj/interactive_demo.o
if %errorlevel% neq 0 goto error

echo 编译test_file_manager...
g++ %CXXFLAGS% -c test_file_manager.cpp -o obj/test_file_manager.o
if %errorlevel% neq 0 goto error

echo 链接存储系统...
g++ obj/FileManager.o obj/Page.o obj/BufferManager.o obj/StorageManager.o obj/SystemCatalog.o obj/test_page_system.o -o test_page_system.exe
if %errorlevel% neq 0 goto error

echo 链接交互式演示...
g++ obj/FileManager.o obj/Page.o obj/BufferManager.o obj/StorageManager.o obj/SystemCatalog.o obj/interactive_demo.o -o interactive_demo.exe
if %errorlevel% neq 0 goto error

echo 链接文件管理器测试...
g++ obj/FileManager.o obj/Page.o obj/BufferManager.o obj/StorageManager.o obj/SystemCatalog.o obj/test_file_manager.o -o test_file_manager.exe
if %errorlevel% neq 0 goto error

echo [成功] 存储系统模块编译完成！

REM 3. 编译完整数据库系统
echo.
echo ====================================
echo 编译完整数据库系统...
echo ====================================

cd ..
if not exist "obj" mkdir obj

echo 编译数据库集成测试...
g++ %CXXFLAGS% -c database_system_test.cpp -o obj/database_system_test.o -Isql_compiler_cpp -Istorage_system_cpp
if %errorlevel% neq 0 goto error

echo 编译数据库集成测试程序...
g++ obj/database_system_test.o ^
    sql_compiler_cpp/obj/Token.o ^
    sql_compiler_cpp/obj/Lexer.o ^
    sql_compiler_cpp/obj/AST.o ^
    sql_compiler_cpp/obj/Parser.o ^
    sql_compiler_cpp/obj/SymbolTable.o ^
    sql_compiler_cpp/obj/SemanticAnalyzer.o ^
    storage_system_cpp/obj/FileManager.o ^
    storage_system_cpp/obj/Page.o ^
    storage_system_cpp/obj/BufferManager.o ^
    storage_system_cpp/obj/StorageManager.o ^
    storage_system_cpp/obj/SystemCatalog.o ^
    -o database_system_test.exe
if %errorlevel% neq 0 goto error

echo [成功] 完整数据库系统编译完成！

REM 4. 创建运行脚本
echo.
echo ====================================
echo 创建运行脚本...
echo ====================================

echo @echo off > run_tests.bat
echo echo ==================================== >> run_tests.bat
echo echo 运行小型数据库系统测试 >> run_tests.bat
echo echo ==================================== >> run_tests.bat
echo echo. >> run_tests.bat
echo echo [1/3] 运行SQL编译器测试... >> run_tests.bat
echo cd sql_compiler_cpp >> run_tests.bat
echo if exist test_parser.exe ( >> run_tests.bat
echo     test_parser.exe >> run_tests.bat
echo ) else ( >> run_tests.bat
echo     echo [错误] test_parser.exe不存在 >> run_tests.bat
echo ) >> run_tests.bat
echo cd .. >> run_tests.bat
echo echo. >> run_tests.bat
echo echo [2/3] 运行存储系统测试... >> run_tests.bat
echo cd storage_system_cpp >> run_tests.bat
echo if exist test_page_system.exe ( >> run_tests.bat
echo     test_page_system.exe >> run_tests.bat
echo ) else ( >> run_tests.bat
echo     echo [错误] test_page_system.exe不存在 >> run_tests.bat
echo ) >> run_tests.bat
echo cd .. >> run_tests.bat
echo echo. >> run_tests.bat
echo echo [3/3] 运行完整数据库系统测试... >> run_tests.bat
echo if exist database_system_test.exe ( >> run_tests.bat
echo     database_system_test.exe >> run_tests.bat
echo ) else ( >> run_tests.bat
echo     echo [错误] database_system_test.exe不存在 >> run_tests.bat
echo ) >> run_tests.bat
echo echo. >> run_tests.bat
echo echo ==================================== >> run_tests.bat
echo echo 测试完成！ >> run_tests.bat
echo echo ==================================== >> run_tests.bat
echo pause >> run_tests.bat

echo [成功] 运行脚本创建完成！

echo.
echo ====================================
echo 🎉 编译完成！
echo ====================================
echo.
echo 可用的程序：
echo   sql_compiler_cpp\interactive_compiler.exe - SQL编译器
echo   sql_compiler_cpp\test_parser.exe - SQL编译器测试
echo   storage_system_cpp\interactive_demo.exe - 存储系统演示
echo   storage_system_cpp\test_page_system.exe - 存储系统测试
echo   database_system_test.exe - 完整数据库系统测试
echo.
echo 运行方式：
echo   1. 双击 run_tests.bat 运行所有测试
echo   2. 或直接运行各个 .exe 文件
echo   3. 或使用命令行：程序名.exe
echo.
pause
goto end

:error
echo.
echo [错误] 编译失败！请检查错误信息。
pause
exit /b 1

:end
